﻿// See https://aka.ms/new-console-template for more information
using new_PortScanner;
using System.Net.Sockets;
using System.Net;

/**
 * 作者：e4glet
 * 2024年10月23日
 */

Console.WriteLine("★★★★★欢迎使用PortScanner端口扫描器★★★★★");
Console.WriteLine("本程序仅用于网络安全专业教学使用，禁止用于非法用途！");

// 新建输入变量
string input;
// 循环执行程序，直到接收到退出指令
do
{
    Console.WriteLine("\n请按照语法输入指令，查看帮助请输入help指令，输入exit退出");
    input = Console.ReadLine();
    if (input == "help")
    {
        Console.WriteLine("请按照下列语法输入指令：");
        Console.WriteLine("cha -i <目标IP>                       扫描指定IP是否存活        示例：cha -i 192.168.0.1");
        Console.WriteLine("cha -p 80 < 目标IP >                  扫描指定IP的特定端口      示例：cha -p 80 192.168.0.1");
        Console.WriteLine("cha -p 22,80,443 < 目标IP >           扫描指定IP的多个端口      示例：cha -p 22,80,443 192.168.0.1");
        Console.WriteLine("cha -p 1-1000 < 目标IP >              扫描指定IP的范围端口      示例：cha -p 1-1000 192.168.0.1");
        Console.WriteLine("cha -p 80-1000 <线程数> < 目标IP >    扫描端口自定义线程数      示例：cha -p 80-500 200 192.168.0.1");
        Console.WriteLine("cha -O <目标IP>                       扫描指定IP的操作系统类型  示例：cha -O 192.168.0.1");
        Console.WriteLine();
    }
    else
    {
        if (!string.IsNullOrEmpty(input) && input != "exit") // 检查输入是否为空或者是否为退出指令
        {
            //检测
            // 使用空格作为分隔符来分割输入
            string[] parameters = input.Split(' ');
            if (parameters.Length == 3 || parameters.Length == 4||parameters.Length==5)
            {
                //正确指令
                if (parameters[0] != "cha" || string.IsNullOrEmpty(parameters[0]))
                {
                    Console.WriteLine("请以cha指令为开头");
                }
                else
                {
                    //根据参数选择执行不同的指令，这里使用switch
                    Console.WriteLine("检测中...");
                    chanceMethod(parameters);                    
                }
            }
            else
            {
                //错误指令
                Console.WriteLine("参数不正确，请按照语法输入指令.");
            }

            
        }
        else if (string.IsNullOrEmpty(input))
        {
            Console.WriteLine("输入不能为空，请按照语法输入指令.\n");
        }
    }    
    // 如果输入是"exit"，则循环将在下次迭代时结束，因此这里不需要额外的处理
} while (input != "exit");

Console.WriteLine("程序已退出");



//封装根据指令选择不同方法
void chanceMethod(string[] parameters)
{    
    // 检测第二个参数
    switch (parameters[1])
    {
        case "-i":
            PortScanner.CheckIsAlive(parameters);
            return;
        case "-p":
            int threadCount = 10; // 默认线程数为10
            if (parameters.Length == 5 && int.TryParse(parameters[4], out int customThreadCount))
            {
                threadCount = customThreadCount;
            }
            //PortScanner.ScanPortsWithThreads(parameters[3], int.Parse(parameters[2]), int.Parse(parameters[2]), threadCount);
            PortScanner.CheckIPAndPort(parameters, threadCount);
            return;
        case "-O":
            PortScanner.DetectionSystem(parameters);
            return;
        //case "-sV":
        //    Console.WriteLine("扫描目标网段功能正在开发中....");
        //    return;
        default:
            Console.WriteLine("错误指令");
            return;
    }
}

